home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / tools / czesc_2 / hold / handler.c < prev    next >
C/C++ Source or Header  |  1992-01-18  |  3KB  |  126 lines

  1. /*
  2.  * handler.c - the input handler that holds the RMB and cycles windows
  3.  *
  4.  * Bruno Costa - 16 Sep 89 - 16 Jan 91
  5.  *
  6.  */
  7.  
  8. #include <exec/types.h>
  9. #include <devices/inputevent.h>
  10. #include <intuition/intuitionbase.h>
  11. #include <intuition/intuition.h>
  12. #include <proto/intuition.h>
  13. #include <proto/exec.h>
  14. #include "hold.h"
  15.  
  16. extern struct IntuitionBase *IntuitionBase;
  17.  
  18. /*
  19.  *  input handler
  20.  */
  21. struct InputEvent *
  22. __saveds __asm handler ( register __a0 struct InputEvent *head,
  23.                          register __a1 struct handlerdata *data
  24.                        )
  25. {
  26.  register struct InputEvent *ep, *old;
  27.  int delink, prelink;
  28.  static struct { ULONG sec, micro; int x, y; } last;
  29.  
  30.  delink = prelink = OFF;
  31.  ep = old = head;
  32.  
  33.  while (ep != NULL)
  34.  {
  35.    if (ep->ie_Class == IECLASS_RAWMOUSE)
  36.    {
  37.      switch (ep->ie_Code)
  38.      {
  39.        case IECODE_RBUTTON:            /* right button down */
  40.          if (data->hold)
  41.            if (data->ignore)
  42.            {
  43.              data->ignore = OFF;
  44.              delink = ON;
  45.            }
  46.            else
  47.            {
  48.              data->ignore = ON;
  49.              last.x = ep->ie_X;
  50.              last.y = ep->ie_Y;
  51.              last.sec = ep->ie_TimeStamp.tv_secs;
  52.              last.micro = ep->ie_TimeStamp.tv_micro;
  53.            }
  54.          break;
  55.  
  56.        case IECODE_RBUTTON | IECODE_UP_PREFIX:    /* right button up */
  57.          if (data->hold && data->ignore)
  58.          {
  59.            if ( (abs (last.x - ep->ie_X) < DCLICKERR)    &&
  60.                 (abs (last.y - ep->ie_Y) < DCLICKERR)    &&
  61.                 DoubleClick (last.sec, last.micro,
  62.                              ep->ie_TimeStamp.tv_secs, ep->ie_TimeStamp.tv_micro) )
  63.              delink = ON;
  64.            else
  65.              data->ignore = OFF;
  66.          }
  67.          break;
  68.  
  69.        case IECODE_LBUTTON | IECODE_UP_PREFIX:    /* left button up */
  70.        case IECODE_LBUTTON:            /* left button down */
  71.          if (data->hold && data->ignore)
  72.          {
  73.            data->ignore = OFF;
  74.            prelink = ON;
  75.            data->event.ie_Class     = IECLASS_RAWMOUSE;
  76.            data->event.ie_SubClass  = 0;
  77.            data->event.ie_Code      = IECODE_RBUTTON | IECODE_UP_PREFIX;
  78.            data->event.ie_Qualifier = 0;
  79.            data->event.ie_X = 0;
  80.            data->event.ie_Y = 0;
  81.            data->event.ie_TimeStamp.tv_secs  = ep->ie_TimeStamp.tv_secs;
  82.            data->event.ie_TimeStamp.tv_micro = ep->ie_TimeStamp.tv_micro - 1;
  83.          }
  84.          break;
  85.  
  86.        case IECODE_NOBUTTON:        /* mouse movement */
  87.          data->count = 0;
  88.          data->activated = FALSE;
  89.          break;
  90.      }
  91.    }
  92.    else if (data->activate)
  93.      if (data->activated == FALSE  &&  ep->ie_Class == IECLASS_TIMER)
  94.        if (++data->count > data->maxtime)
  95.        {
  96.          Signal (data->task, data->actmask);
  97.          data->activated = TRUE;
  98.        }
  99.  
  100.    if (delink)
  101.    {
  102.      delink = OFF;
  103.      if (ep == head)
  104.        old = ep = head = head->ie_NextEvent;
  105.      else
  106.        ep = old->ie_NextEvent = ep->ie_NextEvent;
  107.    }
  108.    else
  109.    {
  110.      if (prelink)
  111.      {
  112.        prelink = OFF;
  113.        data->event.ie_NextEvent = ep;
  114.        if (ep == head)
  115.          head = &data->event;
  116.        else
  117.          old->ie_NextEvent = &data->event;
  118.      }
  119.      old = ep;
  120.      ep = ep->ie_NextEvent;
  121.    }
  122.  }
  123.  
  124.  return (head);
  125. }
  126.